package vip.liux.backend.application.service.files;

import vip.liux.application.dots.ListResultDto;
import vip.liux.application.dots.PagedResultDto;
import vip.liux.backend.application.service.files.dtos.*;
import vip.liux.core.content.IRemoteStreamContent;

import java.util.List;

public interface FileDescriptorAppService {

    /**
     * 根据ID获取文件描述符
     *
     * @param id 文件ID
     * @return 文件描述符
     */
    FileDescriptorDto get(Long id);

    /**
     * 获取目录下的文件描述符列表
     *
     * @param directoryId 目录ID
     * @return 文件描述符列表
     */
    ListResultDto<FileDescriptorDto> getList(Long directoryId);

    /**
     * 重命名文件
     *
     * @param id    文件ID
     * @param input 重命名输入
     * @return 重命名后的文件描述符
     */
    FileDescriptorDto rename(Long id, RenameFileInput input);

    /**
     * 下载文件
     *
     * @param id    文件ID
     * @param token 下载令牌
     * @return 远程流内容
     */
    IRemoteStreamContent download(Long id, String token);

    /**
     * 删除文件
     *
     * @param id 文件ID
     */
    void delete(Long id);

    /**
     * 创建文件
     *
     * @param directoryId     目录ID
     * @param inputWithStream 创建文件输入
     * @return 创建的文件描述符
     */
    FileDescriptorDto create(Long directoryId, CreateFileInputWithStream inputWithStream);

    /**
     * 移动文件
     *
     * @param input 移动文件输入
     * @return 移动后的文件描述符
     */
    ListResultDto<FileDescriptorDto> move(MoveFileInput input);

    /**
     * 获取文件上传预信息
     *
     * @param input 文件上传预信息请求列表
     * @return 文件上传预信息列表
     */
    List<FileUploadPreInfoDto> getPreInfo(List<FileUploadPreInfoRequest> input);

    /**
     * 获取文件内容
     *
     * @param id 文件ID
     * @return 文件内容字节数组
     */
    byte[] getContent(Long id);

    /**
     * 获取文件下载令牌
     *
     * @param id 文件ID
     * @return 下载令牌结果
     */
    DownloadTokenResultDto getDownloadToken(Long id);

    /**
     * 获取目录下的文件分页列表
     *
     * @param input 查询目录输入
     * @return 分页结果
     */
    PagedResultDto<FileDescriptorDto> getPageList(QueryDirectoryInput input);

    /**
     * 删除文件
     *
     * @param ids 文件ids
     */
    void batchDelete(List<Long> ids);
}
